#include "Aux_cmd_define.h"
#include "Aux_yate_hal.h"


//=====================================================================================================================
//=====================================================================================================================
//=====================================================================================================================
//=====================================================================================================================

using namespace TelEngine;

// 注意: 插件名称和动态库名称需要保持一致，否则会导致部分插件管理功能缺失

#define MY_PLUGIN_NAME "demo99"

namespace {	 // 使用匿名空间


	//===============================
	// 类定义

	class MyPlugin : public Module
	{
	public:

		enum Relay {
			Start = Private << 1,
		};


		MyPlugin() : Module(MY_PLUGIN_NAME)
			, m_initialized(false)
		{			
		}


		~MyPlugin() {
		}

		// 模块初始化函数，会被多次调用
		void initialize(void) override;

		// 引擎启动处理
		void onEngineStart();
		
		// 引擎退出处理
		void onEngineStop();

		// 消息处理函数
		bool onYateMessage(Message& msg);

		bool received(Message& msg, int id) override;
		void statusParams(String& str) override;
		void statusDetail(String& str) override;

	private:

		// 插件对象初始化标记
		bool m_initialized;


	};

	//===============================
	// 变量定义


	// 实现模块对象
	INIT_PLUGIN(MyPlugin);

	// 配置文件
	static Configuration s_cfg;


	//===============================
	// 功能实现

	void MyPlugin::initialize()
	{
		Output( "Initializing module " MY_PLUGIN_NAME);

		if (!m_initialized) {

			// 设置初始化标记，避免多次调用情况下出现问题
			m_initialized = true;

			// installRelay(Halt);
			installRelay(Stop);
			installRelay(Status);
			installRelay(Start, "engine.start");

			// 订阅消息处理
			YateMsgHandler* handler;
			handler = new YateMsgHandler(MSG_YATE);
			handler->_handler = [this](Message& msg) {
				return this->onYateMessage(msg);
			};
			Engine::install(handler);

		}


	}

	bool MyPlugin::received(Message& msg, int id)
	{

		switch (id) {

		case Start:
		{
			onEngineStart();
			return false;
		}
		break;

		case Stop:
		{
			onEngineStop();
			return false;
		}
		break;

		default:
		{
			return Module::received(msg, id);
		}
		break;

		}

	}



	void MyPlugin::onEngineStart()
	{

		//S_INFO("onEngineStart, ***************************");
		//Y_WARN("onEngineStart, ***************************");

		//const String& shared = Engine::sharedPath();

		// 用户信息配置路径， 与操作系统的登录用户关联
		//const String& user = Engine::configPath(true);

		// Yate全局配置路径， 与yate的安装路径相关
		//const String& config = Engine::configPath(false);

	}

	void MyPlugin::onEngineStop()
	{
		
		//S_INFO( "onEngineStop ")  ;

	}


	bool MyPlugin::onYateMessage(Message& msg)
	{
		//String Op = msg.getParam("Op");

		return false;
	}

	void MyPlugin::statusParams(String& str)
	{

	}

	void MyPlugin::statusDetail(String& str)
	{

	}


}


/*
* 支持模块内日志宏
*/

TelEngine::DebugEnabler* withDebugEnabler()
{
	return &__plugin;
}

